/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package studente;

import ejb.GestioneCompetenzeLocal;
import ejb.GestioneCorsiLocal;
import ejb.GestioneSediLocal;
import ejb.GestioneServiziLocal;
import ejb.GestoreArticoloLocal;
import ejb.GestoreTutorLocal;
import it.uninsieme.common.Utility;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpSession;
import jpa.Articolo;
import jpa.Corsi;
import jpa.Iscrizione;
import jpa.Sede;
import jpa.Servizio;
import jpa.Tipo;
import jpa.Tutor;
import studente.util.Art;
import studente.util.Service;

/**
 *
 * @author Administrator
 */
@ManagedBean(name = "ServiziBean")
@RequestScoped
public class ServiziBean {

    @EJB
    GestioneServiziLocal gservizi;
    @EJB
    GestoreTutorLocal gtutor;
    @EJB
    GestioneCompetenzeLocal gcompetenza;
    @EJB
    GestioneSediLocal gsedi;
    @EJB
    GestioneCorsiLocal gcorsi;
    @EJB
    GestoreArticoloLocal garticoli;
    private String message;
    private String message2;
    private String message3;
    private String message4;
    private String giorno;
    private String mese;
    private String anno;
    private String ora;
    private String studenteId;
    private String tutorId;
    private String tipoId;
    private String corsoId;
    private List<SelectItem> listaServizi;
    private List<Servizio> servizi;
    private List<SelectItem> listaTipo;
    private List<Tipo> tipi;
    private List<SelectItem> listaGiorni;
    private List<SelectItem> listaMesi;
    private List<SelectItem> listaAnni;
    private List<SelectItem> listaOre;
    private List<SelectItem> listaTutor;
    private List<Service> mieiServizi;
    private List<Tutor> tutor;
    private List<SelectItem> listaCorsi;
    private List<Corsi> corsi;
    private List<Art> articoli;

    /**
     * Creates a new instance of ServiziBean
     */
    public ServiziBean() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
        studenteId = session.getAttribute("id").toString();
    }

    public Collection<Art> getArticoli() {
        List<Articolo> lart = garticoli.listaArticoli();
        articoli = new ArrayList<>();
        if (lart != null) {
            for (Articolo s : lart) {
//                String app = garticoli.chiApprovato(s.getApprovazioneArticoloid());
//                String pubbl = garticoli.chiPubblicato(s.getPubblicazioneid());
                String data = garticoli.quandoPubblicato(s.getPubblicazioneid());
//                String corso = garticoli.corsoAppartenenza(s.getCorsiid());
                articoli.add(new Art(s.getTitolo(), s.getLink(), tutorId, data, data, corsoId));
            }
        }
        return Collections.unmodifiableCollection(articoli);
    }

    public void setArticoli(List<Art> articoli) {
        this.articoli = articoli;
    }

    public Collection<SelectItem> getListaCorsi() {
        List<Integer> idCorsiGiaIscritto = new ArrayList<>();
        for (Iscrizione iscrizione : gcorsi.listaIscrizioni(new Integer(studenteId))) {
            idCorsiGiaIscritto.add(iscrizione.getCorsiid());
        }
        listaCorsi = new ArrayList<>();
        corsi = gcorsi.listaCorsi();
        for (Corsi p : corsi) {
            if (idCorsiGiaIscritto.contains(p.getId())) {
                continue;
            }
            Sede s = gsedi.getSede(p.getSedeid());
            if (s == null) {
                continue;
            }
            String text = p.getNome() + " - " + s.getCitta() + ", " + s.getVia();
            listaCorsi.add(new SelectItem(p.getId(), text));
        }
        Utility.ordinaListaLabel(listaCorsi);
        return Collections.unmodifiableCollection(listaCorsi);
    }

    public void setListaCorsi(List<SelectItem> listaCorsi) {
        this.listaCorsi = listaCorsi;
    }

    public String getCorsoId() {
        return corsoId;
    }

    public void setCorsoId(String corsoId) {
        this.corsoId = corsoId;
    }

    public String getMessage3() {
        return message3;
    }

    public void setMessage3(String message3) {
        this.message3 = message3;
    }

    public String getMessage4() {
        return message4;
    }

    public void setMessage4(String message4) {
        this.message4 = message4;
    }

    public Collection<Service> getMieiServizi() {
        List<Servizio> lserv = gservizi.listaServizi(new Integer(studenteId));
        mieiServizi = new ArrayList<>();
        if (lserv != null) {
            for (Servizio s : lserv) {
                Date d = s.getData();
                int m = d.getMonth() + 1;
                int a = d.getYear() + 1900;
                String data = d.getDate() + "/" + m + "/" + a + " ore " + d.getHours() + ":00";
                mieiServizi.add(new Service(gservizi.getNomeTipo(new Integer(s.getTipoid())), data, gtutor.getNomeTutor(s.getTutorid())));
            }
        }
        return Collections.unmodifiableCollection(mieiServizi);
    }

    public void setMieiServizi(List<Service> mieiServizi) {
        this.mieiServizi = mieiServizi;
    }

    public String getMessage2() {
        return message2;
    }

    public void setMessage2(String message2) {
        this.message2 = message2;
    }

    public Collection<SelectItem> getListaTutor() {
        listaTutor = new ArrayList<>();
        tutor = gtutor.listaTutor();
        for (Tutor p : tutor) {
            String sede = gsedi.getNomeSede(p.getSedeid());
            String competenza = gcompetenza.getCompetenza(p.getCompetenzaid());
            String text = p.getCognome() + " " + p.getNome() + " - " + competenza + " - " + sede;
            listaTutor.add(new SelectItem(p.getId(), text));
        }
        Utility.ordinaListaLabel(listaTutor);
        return Collections.unmodifiableCollection(listaTutor);
    }

    public void setListaTutor(List<SelectItem> listaTutor) {
        this.listaTutor = listaTutor;
    }

    public String getStudenteId() {
        return studenteId;
    }

    public void setStudenteId(String studenteId) {
        this.studenteId = studenteId;
    }

    public String getTipoId() {
        return tipoId;
    }

    public void setTipoId(String tipoId) {
        this.tipoId = tipoId;
    }

    public String getTutorId() {
        return tutorId;
    }

    public void setTutorId(String tutorId) {
        this.tutorId = tutorId;
    }

    public Collection<SelectItem> getListaAnni() {
        listaAnni = new ArrayList<>();
        Date data = new Date(System.currentTimeMillis());
        Integer a = data.getYear() + 1900;
        listaAnni.add(new SelectItem(a, a.toString()));
        a++;
        listaAnni.add(new SelectItem(a, a.toString()));
        return Collections.unmodifiableCollection(listaAnni);
    }

    public void setListaAnni(List<SelectItem> listaAnni) {
        this.listaAnni = listaAnni;
    }

    public Collection<SelectItem> getListaGiorni() {
        listaGiorni = new ArrayList<>();
        for (int i = 1; i < 32; i++) {
            listaGiorni.add(new SelectItem(i, "" + i));
        }
        return Collections.unmodifiableCollection(listaGiorni);
    }

    public void setListaGiorni(List<SelectItem> listaGiorni) {
        this.listaGiorni = listaGiorni;
    }

    public Collection<SelectItem> getListaMesi() {
        listaMesi = new ArrayList<>();
        for (int i = 1; i < 13; i++) {
            listaMesi.add(new SelectItem(i, "" + i));
        }
        return Collections.unmodifiableCollection(listaMesi);
    }

    public void setListaMesi(List<SelectItem> listaMesi) {
        this.listaMesi = listaMesi;
    }

    public Collection<SelectItem> getListaOre() {
        listaOre = new ArrayList<>();

        for (int i = 9; i < 13; i++) {
            listaOre.add(new SelectItem(i, "" + i));
        }
        for (int i = 15; i < 19; i++) {
            listaOre.add(new SelectItem(i, "" + i));
        }
        return Collections.unmodifiableCollection(listaOre);
    }

    public void setListaOre(List<SelectItem> listaOre) {
        this.listaOre = listaOre;
    }

    public String getAnno() {
        return anno;
    }

    public void setAnno(String anno) {
        this.anno = anno;
    }

    public String getGiorno() {
        return giorno;
    }

    public void setGiorno(String giorno) {
        this.giorno = giorno;
    }

    public String getMese() {
        return mese;
    }

    public void setMese(String mese) {
        this.mese = mese;
    }

    public String getOra() {
        return ora;
    }

    public void setOra(String ora) {
        this.ora = ora;
    }

    public Collection<SelectItem> getListaTipo() {
        listaTipo = new ArrayList<>();
        tipi = gservizi.listaTipi();
        for (Tipo p : tipi) {
            String text = p.getNome();
            listaTipo.add(new SelectItem(p.getId(), text));
        }
        Utility.ordinaListaLabel(listaTipo);
        return Collections.unmodifiableCollection(listaTipo);
    }

    public void setListaTipo(List<SelectItem> listaTipo) {
        this.listaTipo = listaTipo;
    }

    public Collection<SelectItem> getListaServizi() {
        listaServizi = new ArrayList<>();
        servizi = gservizi.listaServizi();
        for (Servizio p : servizi) {
            String text = p.getId() + " " + p.getData();
            listaServizi.add(new SelectItem(p.getId(), text));
        }
        Utility.ordinaListaLabel(listaServizi);
        return Collections.unmodifiableCollection(listaServizi);
    }

    public void setListaServizi(List<SelectItem> listaServizi) {
        this.listaServizi = listaServizi;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String richiedi() {
        Servizio s = new Servizio();
        Integer m = new Integer(getMese()) - 1;
        Integer a = new Integer(getAnno()) - 1900;
        Integer g = new Integer(getGiorno());
        Integer o = new Integer(getOra());
        Date data = new Date(a, m, g, o, 0, 0);
        if (data.getTime() < System.currentTimeMillis()) {
            message = "La data non può essere inferiore alla data odierna";
            return "errore";
        }
        s.setData(data);
        s.setFatturato(false);
        s.setStudenteid(new Integer(studenteId));
        try {
            s.setTipoid(new Integer(tipoId));
        } catch (NumberFormatException nfe) {
            message = "Non ci sono servizi da richiedere";
            return "errore";
        }
        try {
            s.setTutorid(new Integer(tutorId));
        } catch (NumberFormatException nfe) {
            message = "Non ci sono tutor disponibili";
            return "errore";
        }
        boolean reg = gservizi.registra(s);
        if (reg == false) {
            message = "Il tutor selezionato non è disponibile nella data indicata";
            return "errore";
        }
        message2 = "Richiesta effettuata corettamente";
        return "RegistrazioneOK";
    }

    public String iscriviti() {
        Iscrizione s = new Iscrizione();
        s.setStudenteid(new Integer(studenteId));
        s.setData(new Date(System.currentTimeMillis()));
        try {
            s.setCorsiid(new Integer(corsoId));
        } catch (NumberFormatException nfe) {
            message3 = "Non ci sono corsi a cui iscriversi";
            return "errore";
        }
        boolean reg = gcorsi.iscrizione(s);
        if (reg == false) {
            message3 = "Sei già iscritto al Corso";
            return "errore";
        }
        message4 = "Iscrizione effettuata corettamente";
        return "RegistrazioneOK";
    }

    public boolean isPresentiCorsi() {
        Collection elencoCorsi = getListaCorsi();
        if (elencoCorsi != null && elencoCorsi.size() > 0) {
            return true;
        }
        return false;
    }
}
